<?php

namespace application\service;

use application\entity\db\Administrator;
use application\entity\db\AdministratorRole;
use application\entity\form\GrantRole;
use application\entity\Response;
use application\model\AdministratorModel;
use application\model\AdministratorRoleModel;
use application\entity\input\AdministratorSearch;
use core\system\Session;
use core\entity\Criteria;
use core\entity\Page;
use application\util\TextUtil;
use Exception;

class AdministratorService extends BaseService {

    private $administratorModel;
    private $roleModel;
    private $cpFunction;

    public function __construct() {
        $this->administratorModel = new AdministratorModel();
        $this->roleModel = new AdministratorRoleModel();
        $this->cpFunction = new \application\model\CpFunctionModel();
    }

    /**
     * Cập nhật trạng thái
     * @param type $id
     * @param type $active
     * @return Response
     */
    public function changeActive($id, $active) {
        $admin = $this->get($id);
        $admin->active = ($active == true);
        $this->administratorModel->isave($admin);
        return new Response(true, "Admin " . $admin->email . " đã " . ($active ? " được kích hoạt" : " bị tạm khóa"), $admin);
    }

    /**
     * Xóa admin theo id
     * @param type $id
     * @return Response
     */
    public function remove($id) {
        $this->administratorModel->iremove($id);
        $this->roleModel->deleteByAdministratorId($id);
        return new Response(true, "Admin đã bị xóa khỏi hệ thống");
    }

    /**
     * Cấp quyền cho tài khoản
     * @param \application\entity\form\GrantRole $form
     * @return \application\entity\Response
     * @throws Exception
     */
    public function grantRole(GrantRole $form) {
        $error = [];
        if ($form == null) {
            return new Response(false, "Thông tin chưa được truyền", $error);
        }
        if ($form->id == null) {
            return new Response(false, "Administrator chưa được truyền vào", $error);
        }
        $admin = $this->get($form->id);
        if ($form->roleId == null || !is_array($form->roleId)) {
            return new Response(false, "Cần chọn quyền để cấp cho thành viên " . $admin->email, $error);
        }
        $adminRole = [];
        $roleId = [];
        foreach ($form->roleId as $role) {
            if (!$this->cpFunction->iexists($role)) {
                return new Response(false, "Mã quyền " . $role . " không tồn tại trên hệ thống", $error);
            }
            if (!in_array($role, $roleId)) {
                $func = new AdministratorRole();
                $func->administratorId = $form->id;
                $func->cpfunctionid = $role;
                $adminRole[] = $func;
                $roleId[] = $role;
            }
        }
        //Xóa đi dể thêm lại
        $this->roleModel->deleteByAdministratorId($form->id);
        foreach ($adminRole as $func) {
            $this->roleModel->isave($func);
        }
        return new Response(true, "Tài khoản " . $admin->email . " đã được câp quyền thành công", $admin);
    }

    /**
     * Danh sách quyền theo admin id
     * @param type $id
     * @return type
     * @throws Exception
     */
    public function getRoleByAdministratorId($id) {
        $admin = $this->get($id);
        return $this->roleModel->getRoleByAdministratorId($id);
    }

    /**
     * Chi tiết admin
     * @param type $id
     * @return type
     * @throws Exception
     */
    public function get($id) {
        $admin = $this->administratorModel->ifindById($id);
        if ($admin->id == null) {
            return new Response("Administrator yêu cầu không tồn tại trên hệ thống");
        }
        return $admin;
    }

    /**
     * Đăng nhập hệ thống
     * @param Administrator $admin
     * @return Response
     */
    public function signin(Administrator $admin) {
        $administrator = $this->administratorModel->getByEmail($admin->email);
        if ($administrator->id == null) {
            $administrator = new Administrator();
            $administrator->email = $admin->email;
            $administrator->description = $admin->description;
            $administrator->joinTime = time();
            $administrator->active = false;
            $this->administratorModel->isave($administrator);
            return new Response(false, "Địa chỉ email " . $admin->email . " không có quyền truy cập hệ thống");
        }
        if (!$administrator->active) {
            return new Response(false, "Địa chỉ email " . $admin->email . " không có quyền truy cập hệ thống, tài khoản đang bị khóa");
        }
        return new Response(true, "Đăng nhập hệ thống quản trị thành công", $administrator);
    }

    /**
     * Tìm kiếm admin
     * @param \application\entity\input\AdministratorSearch $seach
     * @return type
     */
    public function search(AdministratorSearch $search) {
        $cri = new Criteria();
        if (TextUtil::getVariable($search, 'email', null) != null) {
            $cri->andKey('email')->regex('%' . $search->email . '%');
        }
        if (TextUtil::getVariable($search, 'active', 0) > 0) {
            $cri->andKey('active')->is($search->active == 1);
        }
        $page = new Page();
        $page->pageIndex($search->pageIndex, $search->pageSize);
        $dataPage = $this->administratorModel->iSearch($cri, $page);
        return $dataPage;
    }

}
